/**
 * @file request_handler.h
 * @brief HTTP请求处理器
 * @details 处理各种HTTP请求的具体业务逻辑
 */

#pragma once

#include <workflow/HttpMessage.h>
#include <workflow/WFTask.h>
#include <string>

// 前向声明
using WFHttpTask = WFNetworkTask<protocol::HttpRequest, protocol::HttpResponse>;

/**
 * @class RequestHandler
 * @brief HTTP请求处理器类
 * @details 提供各种HTTP请求的处理方法
 */
class RequestHandler 
{
public:
    /**
     * @brief 处理首页请求
     * @param task HTTP任务
     */
    static void handleIndex(WFHttpTask* task);
    
    /**
     * @brief 处理文件上传请求
     * @param task HTTP任务
     */
    static void handleUpload(WFHttpTask* task);
    
    /**
     * @brief 处理文件下载请求
     * @param task HTTP任务
     */
    static void handleDownload(WFHttpTask* task);
    
    /**
     * @brief 处理文件信息查询请求
     * @param task HTTP任务
     */
    static void handleFileInfo(WFHttpTask* task);

    /**
     * @brief 处理静态文件请求
     * @param task HTTP任务
     */
    static void handleStaticFile(WFHttpTask* task);

private:
    /**
     * @brief 解析multipart/form-data上传数据
     * @param content_type Content-Type头部
     * @param body 请求体数据
     * @param filename 输出文件名
     * @param file_data 输出文件数据
     * @return bool 解析是否成功
     */
    static bool parseMultipartFormData(const std::string& content_type,
                                      const std::string& body,
                                      std::string& filename,
                                      std::string& file_data);
    
    /**
     * @brief 从URL路径中提取文件ID
     * @param path URL路径
     * @return std::string 文件ID，失败返回空字符串
     */
    static std::string extractFileId(const std::string& path);
    
    /**
     * @brief 猜测MIME类型
     * @param filename 文件名
     * @return std::string MIME类型
     */
    static std::string guessMimeType(const std::string& filename);
    
    /**
     * @brief 生成临时文件路径
     * @return std::string 临时文件路径
     */
    static std::string generateTempFilePath();
    
    /**
     * @brief 将数据写入临时文件
     * @param file_data 文件数据
     * @param temp_path 临时文件路径
     * @return bool 写入是否成功
     */
    static bool writeToTempFile(const std::string& file_data, const std::string& temp_path);
    
    /**
     * @brief 发送JSON响应
     * @param task HTTP任务
     * @param json_data JSON数据
     * @param status_code HTTP状态码
     */
    static void sendJsonResponse(WFHttpTask* task, const std::string& json_data, 
                                const std::string& status_code = "200");
    
    /**
     * @brief 发送文件响应
     * @param task HTTP任务
     * @param file_path 文件路径
     * @param mime_type MIME类型
     * @param filename 下载文件名
     */
    static void sendFileResponse(WFHttpTask* task, const std::string& file_path,
                                const std::string& mime_type, const std::string& filename);
    
    /**
     * @brief 获取前端HTML页面内容
     * @return std::string HTML内容
     */
    static std::string getFrontendHtml();

    /**
     * @brief 获取静态文件的MIME类型
     * @param file_path 文件路径
     * @return std::string MIME类型
     */
    static std::string getStaticFileMimeType(const std::string& file_path);

    /**
     * @brief 获取项目根目录路径
     * @return std::string 项目根目录的绝对路径
     */
    static std::string getProjectRoot();
}; 